#include "ultrasonic.h"
#include <math.h>

// 发送触发脉冲
void Ultrasonic_Trigger(void)
{
    HAL_GPIO_WritePin(TRIG_GPIO_PORT, TRIG_PIN, GPIO_PIN_SET);
    HAL_Delay(1); // 延时10µs（HAL_Delay单位为ms，这里简化为1ms）
    HAL_GPIO_WritePin(TRIG_GPIO_PORT, TRIG_PIN, GPIO_PIN_RESET);
}


// 获取距离（非阻塞式）
uint32_t Ultrasonic_GetDistance(void)
{
    if (measurement_done)
    {
        uint32_t pulse_width = falling_edge_time - rising_edge_time; // 计算脉冲宽度
        uint32_t distance = (pulse_width * 0.034) / 2;               // 计算距离（单位：cm）
        measurement_done = 0;                                        // 清除标志
        return distance;
    }
    return 0; // 测量未完成
}


// TIM2捕获中断回调函数
void HAL_TIM_IC_CaptureCallback(TIM_HandleTypeDef *htim)
{
    if (htim->Instance == TIM2)
    {
        if (HAL_GPIO_ReadPin(ECHO_GPIO_PORT, ECHO_PIN) == GPIO_PIN_SET)
        {
            // 捕获上升沿时间
            rising_edge_time = HAL_TIM_ReadCapturedValue(htim, TIM_CHANNEL);
            __HAL_TIM_SET_CAPTUREPOLARITY(htim, TIM_CHANNEL_1, TIM_INPUTCHANNELPOLARITY_FALLING); // 切换为下降沿捕获
        }
        else
        {
            // 捕获下降沿时间
            falling_edge_time = HAL_TIM_ReadCapturedValue(htim, TIM_CHANNEL);
            __HAL_TIM_SET_CAPTUREPOLARITY(htim, TIM_CHANNEL_1, TIM_INPUTCHANNELPOLARITY_RISING); // 切换为上升沿捕获
            measurement_done = 1; // 设置测量完成标志
        }
    }
}